/**
 * Creat by TanLei
 * Description:
 * User:86183
 * Date:2022-06-16
 * Time:13:51
 */
//实现一个通用顺序表
//class MyArrayList <T,K,M>{
class MyArrayList<T> {
    //public Object[] elem;
    public T[] elem;
    public int usedSize;

    public MyArrayList() {
        //this.elem = new Object[10];
        this.elem = (T[]) new Object[10];
    }

    //public void add(Object val){
    public void add(T val) {
        this.elem[this.usedSize] = val;
        this.usedSize++;
    }

    //public Object get(int pos){
    public T get(int pos) {
        return this.elem[pos];
    }
}

class Person {

}

public class TestDemo3 {
    //泛型是为了解决某些容器，算法代码的通用性而引入，并且能在编译期间做类型检查。
    //泛型利用的是Object是所有类的祖先类，并且父类的引用可以指向子类对象的特定而工作
    //泛型是一种编译期间的机制，即MyArrayList<Persion>和MyArrayList<Book>在运行期间是一个类型
    //泛型就是java中的一种合法语法，标志就是<>
    public static void main(String[] args) {
        //泛型是作用在编译期间的一种机制，即运行期间没有泛型的概念
        //泛型代码在运行期间，就是我们上面提到的，利用object达到的效果
        Person person = new Person();
        System.out.println(person);

        MyArrayList<String> myArrayList1 = new MyArrayList<>();
        MyArrayList<Integer> myArrayList2 = new MyArrayList<>();
        MyArrayList<Boolean> myArrayList3 = new MyArrayList<>();
        System.out.println(myArrayList1);
        System.out.println(myArrayList2);
        System.out.println(myArrayList3);
        //4.泛型是怎么编译的？
        //机制：擦除机制？？？只作用于编译期间，换句话说，泛型就是编译时期的一种机制。运行期间没有泛型概念
        //编译的时候T擦除为Object

    }

    //泛型的意义：
    //1.自动进行类型的检查
    //2.自动进行类型的转换
    public static void main3(String[] args) {
        MyArrayList<String> myArrayList = new MyArrayList<>();
        myArrayList.add("hello");
        //myArrayList.add(1); 自动进行类型的检查
        String s = myArrayList.get(0);
        System.out.println(s);
        //MyArrayList<int> myArrayList = new MyArrayList<>(); 不能是int应该使用包装类Integer
        MyArrayList<Integer> myArrayList2 = new MyArrayList<>();//泛型的泛型参数一定是类类型，如果是简单类型，那么必须对应的包装类
        myArrayList2.add(1);
        int a = myArrayList2.get(0);
        System.out.println(a);
    }

    public static void main2(String[] args) {
        MyArrayList myArrayList = new MyArrayList();
        myArrayList.add(1);                     //什么都可以放了
        myArrayList.add("hello");               //明知道是啥元素，但是你还要进行强制类型转换
        int val = (int) myArrayList.get(0);      //提出泛型
        System.out.println(val);
    }
}
